/**
 * 日期工具函数
 */

/**
 * 格式化持续时间（秒转换为可读格式）
 * @param seconds 秒数
 * @returns 格式化的持续时间字符串
 */
export function formatDuration(seconds: number): string {
  if (!seconds || seconds <= 0) {
    return '0分钟';
  }

  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const remainingSeconds = seconds % 60;

  const parts: string[] = [];

  if (hours > 0) {
    parts.push(`${hours}小时`);
  }

  if (minutes > 0) {
    parts.push(`${minutes}分钟`);
  }

  if (remainingSeconds > 0 && hours === 0) {
    parts.push(`${remainingSeconds}秒`);
  }

  return parts.length > 0 ? parts.join('') : '0分钟';
}

/**
 * 格式化日期为可读格式
 * @param date 日期对象、时间戳或日期字符串
 * @param format 格式类型
 * @returns 格式化的日期字符串
 */
export function formatDate(
  date: Date | number | string,
  format: 'date' | 'datetime' | 'time' | 'month-day' = 'date'
): string {
  if (!date) {
    return '';
  }

  const dateObj = new Date(date);
  
  if (isNaN(dateObj.getTime())) {
    return '';
  }

  const year = dateObj.getFullYear();
  const month = String(dateObj.getMonth() + 1).padStart(2, '0');
  const day = String(dateObj.getDate()).padStart(2, '0');
  const hours = String(dateObj.getHours()).padStart(2, '0');
  const minutes = String(dateObj.getMinutes()).padStart(2, '0');
  const seconds = String(dateObj.getSeconds()).padStart(2, '0');

  switch (format) {
    case 'datetime':
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    case 'time':
      return `${hours}:${minutes}:${seconds}`;
    case 'month-day':
      return `${month}-${day}`;
    case 'date':
    default:
      return `${year}-${month}-${day}`;
  }
}

/**
 * 获取日期范围的开始和结束时间戳
 * @param days 天数
 * @returns 开始和结束时间戳
 */
export function getDateRange(days: number): { startAt: number; endAt: number } {
  const now = new Date();
  const endAt = Math.floor(now.getTime() / 1000);
  const startAt = Math.floor((now.getTime() - days * 24 * 60 * 60 * 1000) / 1000);
  
  return { startAt, endAt };
}

/**
 * 将时间戳转换为日期对象
 * @param timestamp 时间戳（秒）
 * @returns 日期对象
 */
export function timestampToDate(timestamp: number): Date {
  return new Date(timestamp * 1000);
}

/**
 * 将日期对象转换为时间戳
 * @param date 日期对象
 * @returns 时间戳（秒）
 */
export function dateToTimestamp(date: Date): number {
  return Math.floor(date.getTime() / 1000);
}

/**
 * 检查日期是否在指定范围内
 * @param date 要检查的日期
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 是否在范围内
 */
export function isDateInRange(date: Date, startDate: Date, endDate: Date): boolean {
  return date >= startDate && date <= endDate;
}

/**
 * 获取两个日期之间的天数差
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 天数差
 */
export function getDaysDifference(startDate: Date, endDate: Date): number {
  const timeDiff = endDate.getTime() - startDate.getTime();
  return Math.ceil(timeDiff / (1000 * 3600 * 24));
}

/**
 * 格式化相对时间（如：2天前、1小时前）
 * @param date 日期
 * @returns 相对时间字符串
 */
export function formatRelativeTime(date: Date | number | string): string {
  const now = new Date();
  const targetDate = new Date(date);
  const diffMs = now.getTime() - targetDate.getTime();
  const diffSeconds = Math.floor(diffMs / 1000);
  const diffMinutes = Math.floor(diffSeconds / 60);
  const diffHours = Math.floor(diffMinutes / 60);
  const diffDays = Math.floor(diffHours / 24);

  if (diffDays > 0) {
    return `${diffDays}天前`;
  } else if (diffHours > 0) {
    return `${diffHours}小时前`;
  } else if (diffMinutes > 0) {
    return `${diffMinutes}分钟前`;
  } else {
    return '刚刚';
  }
}